home *** CD-ROM | disk | FTP | other *** search
/ Greenhouse Effect Detection Expriment / NASA Greenhouse Effect Detection Expriment 1992 - Disc 2.iso / software / dos / cdf22pc / src / lib / cdfope.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-02-09  |  3.8 KB  |  165 lines

  1. /******************************************************************************
  2. *
  3. *  NSSDC/CDF                        CDF 'open' operations.
  4. *
  5. *  Version 1.0, 10-Feb-92, ST Systems (STX)
  6. *
  7. *  Modification history:
  8. *
  9. *   V1.0  10-Feb-92, J Love    Original version (was part of `cdflib.c').
  10. *
  11. ******************************************************************************/
  12.  
  13. #include "cdflib.h"
  14.  
  15. /******************************************************************************
  16. * CDFope.
  17. ******************************************************************************/
  18.  
  19. CDFstatus CDFope (ap, item, fnc)
  20. va_list *ap;
  21. long item;
  22. long *fnc;
  23. {
  24. CDFstatus Pstatus = CDF_OK;
  25. CDFstatus Tstatus;
  26.  
  27. switch (item) {
  28.   case CDF_: {
  29.     CDFid *id;
  30.     char *CDFname;
  31.     char cdfname[CDF_PATHNAME_LEN+1];
  32.     char cdfnameX[CDF_PATHNAME_LEN+4+1]; /* +4+1 for .CDF and NUL-terminator */
  33.     CDFid newid;
  34.     long i, Nbytes;
  35.     File *tmpfp;
  36.     struct cdfSTRUCT *CDF;
  37.  
  38.     CDFname = va_arg (*ap, char *);
  39.     id = va_arg (*ap, CDFid *);
  40.  
  41.     if (strlen(CDFname) > CDF_PATHNAME_LEN) {
  42.       strncpy (cdfname, CDFname, CDF_PATHNAME_LEN);
  43.       cdfname[CDF_PATHNAME_LEN] = NUL;
  44.       STATUSdisp (CDF_NAME_TRUNC, Pstatus);
  45.     }
  46.     else
  47.       strcpy (cdfname, CDFname);
  48.  
  49. #if defined(vms)  /** strip trailing blanks if VMS **/
  50.     for (i = strlen(cdfname) - 1; i >= 0; i--) {
  51.        if (cdfname[i] == ' ')
  52.      cdfname[i] = NUL;
  53.        else
  54.      break;
  55.     }
  56. #endif
  57.     if ( ! validCDFname(cdfname)) return BAD_CDF_NAME;
  58.  
  59.     /** look for CDFid to use **/
  60.  
  61.     for (newid = 0; newid < CDF_MAX_CDFS; newid++)
  62.        if (_CDFs[newid] == NULL) break;
  63.  
  64.     if (newid == CDF_MAX_CDFS) return TOO_MANY_CDFS;
  65.  
  66.     ExpandPath (cdfname, cdfnameX);
  67.     strcat (cdfnameX,".cdf");
  68.  
  69.     if ( ! IsReg(cdfnameX)) return NO_SUCH_CDF;
  70.  
  71. #if defined(vms)
  72.     if ( ! fix512(cdfnameX)) return NOT_A_CDF;
  73. #endif
  74.  
  75. #if defined(vms) | defined(__MSDOS__)
  76.     tmpfp = OpenFile (cdfnameX,"rb");
  77. #endif
  78. #if defined(unix)
  79.     tmpfp = OpenFile (cdfnameX,"r");
  80. #endif
  81.     if (tmpfp == NULL) return CDF_OPEN_ERROR;
  82.  
  83.     _CDFs[newid] = (struct cdfSTRUCT *) malloc (sizeof(struct cdfSTRUCT));
  84.     if (_CDFs[newid] == NULL) return BAD_MALLOC;    /* CLEAN UP! */
  85.  
  86.     CDF = _CDFs[newid];
  87.  
  88.     CDF->status = CDF_READ_ONLY;
  89.     CDF->fp = tmpfp;
  90.     strcpy (CDF->filename, cdfname);
  91.     CDF->id = newid;
  92.  
  93.     /* Fill in CDF data structure */
  94.  
  95.     CDF->varHead = NULL;
  96.     CDF->varTail = NULL;
  97.     for (i = 0; i < CDF_MAX_VARS; i++) CDF->var[i] = NULL;
  98.  
  99.     CDF->attrHead = NULL;
  100.     CDF->attrTail = NULL;
  101.  
  102.     getint32 (CDF->fp, CDF->magic_number);
  103.     if (CDF->magic_number == V2_MAGIC_NUMBER) {
  104.       Tstatus = read_V2_header (CDF);
  105.       STATUSdisp (Tstatus, Pstatus);    /* CLEAN UP if ERROR */
  106.     }
  107.     else {
  108.       if (CDF->magic_number == V1_MAGIC_NUMBER_flip) {
  109. #if defined(vax)
  110.     Tstatus = read_V1_header (CDF);
  111.     STATUSdisp (Tstatus, Pstatus);    /* CLEAN UP if ERROR */
  112.     STATUSdisp (VERSION_1_CDF, Pstatus);
  113. #else
  114.     return V1_CDF_UNSUPPORTED;
  115. #endif
  116.       }
  117.       else
  118.     return NOT_A_CDF;
  119.     }
  120.  
  121.     CDF->recnum = 0;
  122.     CDF->reccount = 1;
  123.     CDF->recinterval = 1;
  124.  
  125.     if (CDF->GDR.NumDims > 0) {
  126.       Nbytes = CDF->GDR.NumDims * sizeof(long);
  127.  
  128.       CDF->indices = (long *) malloc (Nbytes);
  129.       if (CDF->indices == NULL) return BAD_MALLOC;
  130.       CDF->counts = (long *) malloc (Nbytes);
  131.       if (CDF->counts == NULL) return BAD_MALLOC;
  132.       CDF->intervals = (long *) malloc (Nbytes);
  133.       if (CDF->intervals == NULL) return BAD_MALLOC;
  134.  
  135.       for (i = 0; i < CDF->GDR.NumDims; i++) {
  136.      CDF->indices[i] = 0;
  137.      CDF->counts[i] = CDF->GDR.DimSizes[i];
  138.      CDF->intervals[i] = 1;
  139.       }
  140.     }
  141.     else {
  142.       CDF->indices = NULL;
  143.       CDF->counts = NULL;
  144.       CDF->intervals = NULL;
  145.     }
  146.  
  147.     CDF->CURentryNum = RESERVED_ENTRYNUM;
  148.  
  149.     CDF->CURvar = NULL;
  150.     CDF->CURattr = NULL;
  151.     CDF->CURentry = NULL;
  152.  
  153.     _CURcdf = CDF;
  154.  
  155.     *id = newid;
  156.     break;
  157.   }
  158.   default: {
  159.     *fnc = item;
  160.     break;
  161.   }
  162. }
  163. return Pstatus;
  164. }
  165.